package com.ipartek.formacion.net;

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.URL;
import java.util.ArrayList;

import com.ipartek.formacion.beans.Persona;

class ParseURL {

	private final static String PATH_FICHERO = "data/ranking.txt";
	private final static String PATRON = "<div id=\"rankings\"";
	private final static String PATRON_DIV_ABIERTO = "<div";
	private final static String PATRON_DIV_CERRADO = "</div>";
	private final static String PATRON_COMIENZO_NOMBRE = "class=\"ridername\">";
	private final static String PATRON_FINAL_NOMBRE = "</span>";

	private static File fichero;
	private static BufferedReader brFichero;

	private static BufferedWriter bwFichero;

	public static void main(String[] args) {
		URL aURL = null;

		try {
			// Conpruebo si ya se han guardado los nombres de las personas de
			// los rankings en el fichero
			// si se ha guardado, no vuelvo a descargarla de INTERNET
			fichero = new File(PATH_FICHERO);
			if (!fichero.exists() || fichero.length() < 0) {

				// Descargo la informacion de INTERNET
				aURL = new URL("http://www.ibaworldtour.com");

				BufferedReader bfEntrada = new BufferedReader(
						new InputStreamReader(aURL.openStream()));
				String inputLine;

				ArrayList<String> listaDatos = new ArrayList<String>();

				while ((inputLine = bfEntrada.readLine()) != null) {
					listaDatos.add(inputLine);
				}
				bfEntrada.close();

				// Analizo los datos para recuperar solo todos los rankings

				String linea = "";
				int contadorDivAbierto = 0;
				int contadorDivCerrado = 0;
				ArrayList<String> listaRankings = new ArrayList<String>();

				boolean encontrado = false;
				for (int i = 0; i < listaDatos.size() - 1; i++) {

					linea = listaDatos.get(i);

					if (linea.contains(PATRON) || encontrado) {
						encontrado = true;
						listaRankings.add(linea);

						while (linea.indexOf(PATRON_DIV_ABIERTO) != -1
								|| linea.indexOf(PATRON_DIV_CERRADO) != -1) {

							if (linea.indexOf(PATRON_DIV_ABIERTO) != -1) {
								linea = linea.substring(
										linea.indexOf(PATRON_DIV_ABIERTO)
												+ PATRON_DIV_ABIERTO.length(),
										linea.length());
								contadorDivAbierto++;
							}
							if (linea.indexOf(PATRON_DIV_CERRADO) != -1) {
								linea = linea.substring(
										linea.indexOf(PATRON_DIV_CERRADO)
												+ PATRON_DIV_CERRADO.length(),
										linea.length());
								contadorDivCerrado++;
							}
						}
						if (contadorDivAbierto == contadorDivCerrado) {
							encontrado = false;
						}
					}

				}

				// Recupero los nombres de los rankings y los guardo en fichero
				bwFichero = new BufferedWriter(new FileWriter(fichero));

				String nombre = "";
				for (int i = 0; i < listaRankings.size() - 1; i++) {
					nombre = listaRankings.get(i);

					while (nombre.indexOf(PATRON_COMIENZO_NOMBRE) != -1
							|| nombre.indexOf(PATRON_FINAL_NOMBRE) != -1) {

						if (nombre.indexOf(PATRON_COMIENZO_NOMBRE) != -1) {
							nombre = nombre.substring(
									nombre.indexOf(PATRON_COMIENZO_NOMBRE)
											+ PATRON_COMIENZO_NOMBRE.length(),
									nombre.length());
						}
						if (nombre.indexOf(PATRON_FINAL_NOMBRE) != -1) {
							nombre = nombre.substring(0,
									nombre.indexOf(PATRON_FINAL_NOMBRE));
							bwFichero.write(nombre + "\n");
						}
					}
				}
				bwFichero.close();
				leerFicheroRiders();

			} else {
				leerFicheroRiders();
				// Leo el fichero de Riders y genero un arraylist de objetos
				// persona con su nombre apellido y nacionalidad
				// Leemos el fichero con los datos de las personas de los
				// rankings
			}
		} catch (Exception e) {
			// TODO capturar las excepciones no genericas

		}
	}

	/**
	 * Leo el fichero de Riders y genero un arraylist de objetos persona con su
	 * nombre apellido y nacionalidad Leemos el fichero con los datos de las
	 * personas de los rankings
	 */
	public static void leerFicheroRiders() {
		try {
			brFichero = new BufferedReader(new FileReader(fichero));

			ArrayList<Persona> listaPersonas = new ArrayList<Persona>();

			String rider = "";
			String nombre = "";
			String apellido = "";
			String nacionalidad = "";

			while ((rider = brFichero.readLine()) != null) {

				nombre = rider.substring(0, rider.indexOf(" "));
				apellido = rider.substring(rider.indexOf(" ") + 1,
						rider.indexOf(" ("));
				nacionalidad = rider.substring(rider.indexOf("(") + 1,
						rider.indexOf(")"));

				Persona persona = new Persona();

				persona.setNombre(nombre);
				persona.setApellido1(apellido);
				persona.setNacionalidad(nacionalidad);

				listaPersonas.add(persona);
			}

			brFichero.close();
		} catch (FileNotFoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}

	}
}
